package com.ynkbny.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ynkbny.base.PageResult;
import com.ynkbny.domain.Calculater;
import com.ynkbny.domain.dto.TEpTotalEnergyDTO;
import com.ynkbny.domain.excel.TEpTotalEnergyExportVO;
import com.ynkbny.util.Res;
import org.apache.ibatis.annotations.Param;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
* @author YY
* @description 针对表【t_ep_total_energy(用能单位能源资源计量采集数据)】的数据库操作Service
* @createDate 2023-07-10 20:02:40
*/
public interface TEpTotalEnergyService extends IService<TEpTotalEnergyDTO> {

    /**
     * excel导入
     *
     * @author : juzipi123
     * @param file 文件
     * @throws   IOException 异常
     * @return 结果
     */
    List<String> importExcel(MultipartFile file) throws IOException;

    /**
     * excel导出 根据 统一社会信用代码 数据统计时间（月） 和 是否已上报（dataIndex 是否为空 0为空 1不为空） 查询列表
     *
     * @author : juzipi123
     * @param enterpriseCode 统一社会信用代码
     * @param statDate 时间 （年-月）2021-08
     * @param dataIndex 端系统记录索引
     * @return 导出文件
     */
    List<TEpTotalEnergyExportVO> exportExcel(String enterpriseCode, String statDate,String dataIndex);
    /**
     * 分页查询
     *
     * @author : YY
     * @param pageNum 页码
     * @param pageSize 单页条数
     * @param conditionJson 查询条件
     * @return TEpTotalEnergyVO集合
     */
    Page<TEpTotalEnergyDTO> selectByPage(Long pageNum, Long pageSize, String conditionJson);

    /**
     * 根据企业社会信用代码查询
     *
     * @param pageNum
     * @param pageSize
     * @param condition
     * @return
     */
    PageResult<TEpTotalEnergyDTO> pageList(Long pageNum, Long pageSize, String condition);

    /**
     * 能耗数据上报查询
     *
     * @author : YY
     * @param enterpriseCode 统一社会信用代码
     * @param statType 数据采集频率(0：实时 1：日 2：月 3：年)
     * @return TEpTotalEnergyVO集合
     */
    List<TEpTotalEnergyDTO> selectList(String enterpriseCode, String statType);

    /**
     * 数据上报结果回写
     *
     * @author : YY
     * @param dto TEpTotalEnergyDTO
     * @return 成功回写数量
     */
    @Transactional(rollbackFor = Exception.class)
    int updateTotalEnergy(TEpTotalEnergyDTO dto);

    /**
     * 通过实体上报数据
     *
     * @author : YY
     * @param dto 上报数据实体
     * @return true or false
     */
    Res<Object> upLoadEnergyOne(TEpTotalEnergyDTO dto);

    /**
     * 通过实体上报数据V2
     *
     * @author : YY
     * @param dto 上报数据实体
     * @return Res<Object>
     */
    Res<Object> upLoadEnergyOneV2(TEpTotalEnergyDTO dto);

    /**
     * 批量数据上报
     *
     * @param list
     * @return
     */
    Res<Object> upLoadEnergyBatch(List<TEpTotalEnergyDTO> list);

    /**
     * 批量数据上传（必须同为一个企业）
     *
     * @author : YY
     * @param dtoList List<TEpTotalEnergyDTO>
     * @return Res<Object>
     */
    Res<Object> uploadDataEnergy(List<TEpTotalEnergyDTO> dtoList);

    /**
     * 单项目电力上报 （上报昨日用电）
     *
     * @author : juzipi123
     * @param enterpriseCode 社会信用代码
     * @param energyTypeCode 能源类型代号
     */
    void automaticByEnterpriseCode(String enterpriseCode,String energyTypeCode);

    /**
     * 上报企业昨日用电 （点位表 字段 escalation = 1 的项目（1：需要；0：不需要））
     *
     * @author : juzipi123
     * @param energyTypeCode 能源类型代号
     */
    void automaticByDevicePoint(String energyTypeCode);

    /**
     * 按时间段 上报企业昨日用电 （点位表 字段 escalation = 1 的项目（1：需要；0：不需要））
     *
     * @author : juzipi123
     * @param energyTypeCode 能源类型代号
     * @param startTime 时间
     */
    void automaticByStartTime(String energyTypeCode,String startTime);

    /**
     * 批量数据上报
     *
     * @author : YY
     * @param dtoList List<TEpTotalEnergyDTO>
     * @return List<JSONObject>
     *
     * 响应码 响应内容 备注
     * 200:操作成功;
     * 401:AK验证失败,请确认AK的完整性和有效性;
     * 402:AK已经过期,请重新申请;
     * 403:签名验证失败,请确认签名的完整性和有效性;
     * 404:平台版本无效,请同步平台版本及数据;
     * 405:缺少平台服务版本;
     * 406:缺少基础数据版本;
     * 420:JSON格式错误;
     * 421:数据格式错误或无效;
     * 422:数据索引错误或无效;
     * 423:企业注册状态无效;
     * 424:当前时间不是企业能耗数据交换时间; 详见端系统获取AK,省级平台响应数据;
     * 440:其它错误; 详见错误信息字段;
     * 500:由于上送数据质量存在问题,省级平台拒绝请求;
     */
    List<JSONObject> upLoadData(List<TEpTotalEnergyDTO> dtoList);

    /**
     *  计算好需要上报的数据 （点位表 字段 escalation = 1 的项目（1：需要；0：不需要））
     *
     * @author : juzipi123
     * @param energyTypeCode 能源类型代号
     */
    String countData(String energyTypeCode);

    /**
     * 近一个月已上报数据
     * @return
     */
    Map<String,Long> getReportList();

    /**
     * 近一个月未上报数据
     * @return
     */
    Map<String,Long> getUnReportList();
}
